package semantico;

import simbolos.Tipo;

/**
 * Implementa codigo de tres enderecos para um comando 'se'.
 * @author Cefanys
 */
public class DesvioSE extends Codigo{

	Expressao expressao;
	Codigo codigo;
	
	public DesvioSE(Expressao expressao, Codigo codigo) throws SemanticoException{
		this.expressao = expressao;
		this.codigo = codigo;
		
		if(this.expressao.tipo != Tipo.LOGICO) montaErro(2, "");
	}
	
	/**
	 * Gera codigo de tres enderecos
	 * @param inicio - marca o inicio do codigo para o comando.
	 * @param primeiraInstrucaoApos - marca a primeira instrucao apos o codigo do comando.
	 * @throws SemanticoException 
	 */
	public void gerar(int inicio, int primeiraInstrucaoApos) throws SemanticoException{
		int rotulo = novoRotulo(); //rotulo do codigo para Codigo
		expressao.desviar(0, primeiraInstrucaoApos);//segue se for verdadeiro, vai para primeira instrucao apos o 'se' se for falso
		emitirRotulos(rotulo);
		codigo.gerar(rotulo, primeiraInstrucaoApos);		
	}
}
